//	COPYRIGHT (C) 1980 BY BOARD OF TRUSTEES,
//	LELAND STANFORD JUNIOR UNIVERSITY

GET "BCPLIB.GET[1,35]"
GET "MYLIB.GET[1,35]"
STATIC $( VECSPACE = VEC 2600 $);
LET DOSTUFF() BE
 $( STATIC $( CTELIST = NIL; ANYBONDS = NIL; FIRSTFREE = 1;
              STRUCNAME = NIL; ESCOMS = NIL; STRUCTYPE = NIL;
              CHUNKIX = NIL; ESSIX = NIL; ORIGSTRUCNAME = NIL;
              TERMTYPE = NIL; IBLIST = NIL $);
 GET "LINSTR.BCL[1,35]";
 GET "SEGFNS.BCL[1,35]"
 GET "LSTFNS.BCL[1,35]";
 GET "BASES.BCL[1,35]"
 GET "ESRW.BCL[1,35]"
 GET "INTES.BCL[1,35]"

LET UPDATEESSTRUC() BE
 $( STATIC $( OIN = NIL; OOUT = NIL; NCOPY = NIL $);
 IF STRUCNAME NE ORIGSTRUCNAME DO
  $(
  OIN:=INPUT;
  INPUT:=FINDFILE("DSK",TOPFILENAME(),CGEXT);
  CHUNKIX:=FINDSEG(CHUNKSEP,ESHEADSTR);
  ESSIX:=(CHUNKIX>0 -> FINDSEG(ESSEP,STROFNUM(STRUCNAME)),0);
  ENDREAD(INPUT);
  INPUT:=OIN
  $);
 OIN:=INPUT;
 OOUT:=OUTPUT;
 INPUT:=FINDFILE("DSK",TOPFILENAME(),CGEXT);
 OUTPUT:=CREATEFILE("DSK",SC1FILENAME(),CGEXT);
 NCOPY:=(CHUNKIX>0 -> CHUNKIX, -CHUNKIX+1);
 WHILE NCOPY>0 DO $( NCOPY-:=1; COPYSEG(CHUNKSEP,TRUE) $);
 TEST CHUNKIX>0 THEN
  $(
  NCOPY:=(ESSIX>0 -> ESSIX,-ESSIX+1);
  WHILE NCOPY>0 DO $( NCOPY-:=1; COPYSEG(ESSEP,TRUE) $);
  IF ESSIX>0 DO SKIPSEG(ESSEP);
  OUTSNUM(STRUCNAME);
  NEWLINE(1);
  OUTSNUM(STRUCTYPE);
  NEWLINE(1);
  WRITEESSTRUC();
  OUTCH(ESSEP)
  $)
 OR
  $(
  OUTS(ESHEADSTR);
  NEWLINE(1);
  OUTCH(ESSEP);
  OUTSNUM(STRUCNAME);
  NEWLINE(1);
  OUTSNUM(STRUCTYPE);
  NEWLINE(1);
  WRITEESSTRUC();
  OUTCH(ESSEP);
  NEWLINE(1);
  OUTCH(CHUNKSEP)
  $);
 COPYTOEND();
 ENDREAD(INPUT);
 ENDWRITE(OUTPUT);
 INPUT:=OIN;
 OUTPUT:=OOUT;
 INTERRUPTABLE(FALSE);
 FILEREPLACE(TOPFILENAME(),CGEXT,SC1FILENAME(),CGEXT);
 OUTSNUM(STRUCNAME);
 OUTS((ESSIX>0 -> " REDEFINED*C*L"," DEFINED*C*L"));
 INTERRUPTABLE(TRUE)
 $);

LET INITDIALOG() BE
 $( STATIC $( ITEMS = NIL; OIN = NIL; UNKSTRNUM = NIL $);

 LET DEMANDSTR(STR) = VALOF
  $( STATIC $( ITEMS = NIL $);
  ITEMS:=LINEIN(STR) REPEATUNTIL [ITEMS!0>0] BITAND [ITEMS!1=STRTYPE];
  RESULTIS ITEMS
  $);

 OIN:=INPUT;
 INPUT:=FINDFILE("DSK",SC1FILENAME(),CGEXT);
 ITEMS:=LINEIN("");
 IF [ITEMS!0 NE 5] BITOR
      [ITEMS!1 NE STRTYPE] BITOR
      [ITEMS!2 NE NUMOFSTR("EDIT")] DO
  $(
  SKIPSEG(ESSEP);
  READRETURN();
  ITEMS:=LINEIN("");
  STRUCTYPE:=ITEMS!2;
  STRUCNAME:=ITEMS!4;
  ORIGSTRUCNAME:=ITEMS!6;
  FIRSTFREE:=ITEMS!8;
  CHUNKIX:=ITEMS!10;
  ESSIX:=ITEMS!12;
  TERMTYPE:=ITEMS!14;
  READESSTRUC();
  LINEIN("");
  ENDREAD(INPUT);
  DELETEFILE(SC1FILENAME(),CGEXT);
  INPUT:=OIN;
  RETURN
  $)
 STRUCTYPE:=ITEMS!4;
 STRUCNAME:=ITEMS!6;
 TERMTYPE:=ITEMS!8;
 READRETURN();
 LINEIN("");
 SWAPLITEMS();
 ENDREAD(INPUT);
 INPUT:=OIN;
 DELETEFILE(SC1FILENAME(),CGEXT);
 UNKSTRNUM:=NUMOFSTR("UNKNOWN");
 IF STRUCNAME=UNKSTRNUM DO STRUCNAME:=[DEMANDSTR("NAME:")]!2;
 OIN:=INPUT;
 INPUT:=FINDFILE("DSK",TOPFILENAME(),CGEXT);
 CHUNKIX:=FINDSEG(CHUNKSEP,ESHEADSTR);
 ESSIX:=(CHUNKIX>0 -> FINDSEG(ESSEP,STROFNUM(STRUCNAME)),0);
 TEST ESSIX>0 THEN
  $(
  LINEIN("");
  STRUCTYPE:=LITEMS!2;
  READESSTRUC();
  ENDREAD(INPUT);
  INPUT:=OIN;
  OUTS("(OLD ")
  $)
 OR
  $(
  ENDREAD(INPUT);
  INPUT:=OIN;
  IF STRUCTYPE=UNKSTRNUM DO STRUCTYPE:=[DEMANDSTR("STRUCTURE TYPE:")]!2;
  CTELIST:=@NULL;
  ANYBONDS:=@NULL;
  OUTS("(NEW ")
  $);
 ORIGSTRUCNAME:=STRUCNAME;
 OUTSNUM(STRUCTYPE);
 OUTS(")*C*L");
 SWAPLITEMS()
 $);

 INITLISTS(NEWVEC(1000),1000);
 MAKESCAT(NEWVEC(200),200,NEWVEC(400),400);
 IBLIST:=@NULL;
 INITDIALOG();
 TEST EDITSTRUC() THEN  UPDATEESSTRUC()
 OR OUTS("(EXITTING WITH NO STRUCTURE MODIFICATIONS)*C*L");
 EXECUTERETURN()
 $);
LET START() BE
 $(
  ![#124]:=TOPORSTOP;
 INITIALISEIO(VECSPACE,2600);
 OUTPUT:=TTY;
 INPUT:=TTY;
 RECINIT();
 DOSTUFF()
 $)
